#include <bits/stdc++.h>
using namespace std;
map<char,int> let;
typedef long long ll;
int n,p;
char s[20][20];
int lton[30];
bool used[30];
struct letter{
    char ch;
    int num;
    //是否是首位
    bool flag;
}a[30];
bool check(){
    int tmp=0,sum=0,num=0;
    for(int i=0;i<n;i++){
        tmp=0;
        for(int j=0;j<strlen(s[i]);j++){
            tmp=tmp*10+lton[s[i][j]-'A'];
        }
        sum+=tmp;
    }
    for(int i=0;i<strlen(s[n-1]);i++){
        num=num*10+lton[s[n-1][i]-'A'];
    }
    return sum==num;
}
ll dfs(int pos){
    ll ans=0;
    if(pos>=p){
        if(check()){
            return 1;
        }
        else{
            return 0;
        }
    }
    for(int i=0;i<=9;i++){
        if(!used[i]){
            if(!a[pos].flag && i==0){
                continue;
            }
            a[pos].num=i;
            lton[a[pos].ch-'A']=i;
            used[i]=true;
            ans+=dfs(pos+1);
            used[i]=false;
        }
    }
    return ans;
}
int main(void){
    scanf("%d",&n);
    //有多少个不重复字母
    p=0;
    memset(lton,0,sizeof(lton));
    for(int i=0;i<n;i++){
        scanf("%s",s[i]);
        int len=strlen(s[i]);
        for(int j=0;j<len;j++){
            if(!lton[s[i][j]-'A']){
                a[p].flag=true;
                a[p++].ch=s[i][j];
                lton[s[i][j]-'A']=1;
            }
            if(j==0){
                for(int k=0;k<p;k++){
                    if(a[k].ch==s[i][j]){
                        a[k].flag=false;
                    }
                }
            }
        }
    }
    ll ans=0;
    memset(used,0,sizeof(used));
    ans=dfs(0);
    printf("%lld\n",ans);
    return 0;
}